home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 23 / AMIGAplus Sonderheft 23 (2000)(Falke)(DE)[!].iso / Updates / Datatypes / JPEG-DT / Source / savejpeg.c < prev   
C/C++ Source or Header  |  1999-11-14  |  3KB  |  136 lines

  1. #include <clib/alib_protos.h>
  2. #include <pragma/datatypes_lib.h>
  3. #include <pragma/exec_lib.h>
  4. #include <pragma/graphics_lib.h>
  5. #include <pragma/jpeg_lib.h>
  6. #include <cybergraphx/cybergraphics.h>
  7. #include <datatypes/pictureclass.h>
  8. #include <tools/tools.h>
  9. #include "class.h"
  10.  
  11. struct JPEGINFO
  12. {
  13. Object *obj;
  14. RastPort *rp,*trp;
  15. UBYTE *buffer,*pix,*col;
  16. UWORD d;
  17. UWORD gray;
  18. ULONG h;
  19. };
  20.  
  21. void ReadPrefs(Data *data);
  22.  
  23. static void _getline(UBYTE **scanline,ULONG y,ULONG w,JPEGINFO *info)
  24. {
  25. ULONG x;
  26. register UBYTE *buf=info->buffer;
  27. if(info->d<=8)
  28.     {
  29.     register UBYTE *pix=info->pix,*cp;
  30.     ReadPixelLine8(info->rp,0,y,w,pix,info->trp);
  31.     if(info->gray)
  32.         {
  33.         for(x=0;x<w;x++)
  34.             {
  35.             cp=&info->col[*(pix++)*3];
  36.             *(buf++)=(UWORD(cp[0])+UWORD(cp[1])+UWORD(cp[2]))/3;
  37.             }
  38.         }
  39.     else
  40.         {
  41.         for(x=0;x<w;x++)
  42.             {
  43.             cp=&info->col[*(pix++)*3];
  44.             *(buf++)=cp[0];
  45.             *(buf++)=cp[1];
  46.             *(buf++)=cp[2];
  47.             }
  48.         }
  49.     }
  50. else
  51.     {
  52.     DoMethod(info->obj,PDTM_READPIXELARRAY,buf,RECTFMT_RGB,w*3,0,y,w,1);
  53.     if(info->gray)
  54.         {
  55.         ULONG x1;
  56.         for(x=x1=0;x<w;x++,x1+=3) buf[x]=(UWORD(buf[x1])+UWORD(buf[x1+1])+UWORD(buf[x1+2]))/3;
  57.         }
  58.     }
  59. *scanline=info->buffer;
  60. }
  61.  
  62. static ULONG getline(register __a0 UBYTE **scanline,register __d0 ULONG line,register __d1 ULONG w,register __a1 void *userdata)
  63. {
  64. _getline(scanline,line,w,(JPEGINFO *)userdata);
  65. return 0;
  66. }
  67.  
  68. ULONG SaveJPEG(IClass *cl,Object *obj,dtWrite *msg)
  69. {
  70. ULONG retval=0;
  71. ULONG w,h,d;
  72. UBYTE *buffer;
  73. BitMapHeader *bh;
  74. JPEGComHandle *jpc;
  75. GetDTAttrs(obj,PDTA_BitMapHeader,&bh,TAG_END);
  76. w=bh->bmh_Width;
  77. h=bh->bmh_Height;
  78. d=bh->bmh_Depth;
  79. if(buffer=(UBYTE *)AllocVec(w*3,0))
  80.     {
  81.     Data *data=(Data *)INST_DATA(cl,obj);
  82.     ReadPrefs(data);
  83.     if(d<=8)
  84.         {
  85.         BitMap *tbm,*bm;
  86.         GetDTAttrs(obj,PDTA_BitMap,&bm,TAG_END);
  87.         if(tbm=AllocBitMap(w,1,d,BMF_MINPLANES,bm))
  88.             {
  89.             UBYTE *pix;
  90.             if(pix=(UBYTE *)AllocVec(((w+16)>>4)<<4,0))
  91.                 {
  92.                 UBYTE *col;
  93.                 RastPort rp,trp;
  94.                 InitRastPort(&rp);
  95.                 InitRastPort(&trp);
  96.                 rp.BitMap=bm;
  97.                 trp.BitMap=tbm;
  98.                 GetDTAttrs(obj,PDTA_ColorRegisters,&col,TAG_END);
  99.                 if(!AllocJPEGCompress(&jpc,JPG_DestFile,msg->dtw_FileHandle,TAG_END))
  100.                     {
  101.                     JPEGINFO info={0,&rp,&trp,buffer,pix,col,d,data->gray,h};
  102.                     if(!CompressJPEG(jpc,JPG_CompressHook,getline,JPG_CompressUserData,&info,
  103.                     JPG_Width,w,JPG_Height,h,
  104.                     JPG_Quality,data->quality,
  105.                     JPG_Smoothing,data->smooth,
  106.                     JPG_ColourSpace,data->gray?JPCS_GRAYSCALE:JPCS_RGB,
  107.                     JPG_DCTMethod,data->dct,
  108.                     JPG_BytesPerPixel,data->gray?1:3,TAG_END)) retval=1;
  109.                     FreeJPEGCompress(jpc);
  110.                     }
  111.                 FreeVec(pix);
  112.                 }
  113.             FreeBitMap(tbm);
  114.             }
  115.         }
  116.     else
  117.         {
  118.         if(!AllocJPEGCompress(&jpc,JPG_DestFile,msg->dtw_FileHandle,TAG_END))
  119.             {
  120.             JPEGINFO info={obj,0,0,buffer,0,0,d,data->gray,h};
  121.             if(!CompressJPEG(jpc,JPG_CompressHook,getline,JPG_CompressUserData,&info,
  122.             JPG_Width,w,JPG_Height,h,
  123.             JPG_Quality,data->quality,
  124.             JPG_ColourSpace,data->gray?JPCS_GRAYSCALE:JPCS_RGB,
  125.             JPG_Smoothing,data->smooth,
  126.             JPG_DCTMethod,data->dct,
  127.             JPG_BytesPerPixel,data->gray?1:3,TAG_END)) retval=1;
  128.             FreeJPEGCompress(jpc);
  129.             }
  130.         }
  131.     FreeVec(buffer);
  132.     }
  133. return retval;
  134. }
  135.  
  136.